package com.tensquare.user.service;

import com.tensquare.user.dao.UserDao;
import com.tensquare.user.pojo.User;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import util.IdWorker;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * @author Macross
 * @Type UserService.java
 * @Desc 用户service服务类
 * @date 2019/12/23 12:15
 */
@Service
public class UserService {

    @Autowired
    private UserDao userDao;
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @Autowired
    private RedisTemplate<String,String> redisTemplate;
    @Autowired
    private IdWorker idWorker;
    @Autowired
    private BCryptPasswordEncoder encoder;

    public void sendSms(String mobile) {
        //生成用于存放需要发送的数据的map
        Map<String,String> dataMap = new HashMap<>(2);
        //存放手机号
        dataMap.put("mobile",mobile);
        //获取一个随机码作为验证码
        String validCode = getRandomCode();
        //存放验证码
        dataMap.put("code", validCode);
        //将验证码放入redis中,key为手机号,value为验证码,过期时间为5min
        redisTemplate.opsForValue().set(mobile,validCode,5,TimeUnit.MINUTES);
        //发送短信
        rabbitTemplate.convertAndSend("sms",dataMap);
    }

    /**
     * 添加用户
     * @param user 用户信息
     */
    public void addUser(User user) {
        //设置用户对应的ID
        user.setId(idWorker.nextId()+"");
        //设置用户的注册日期
        user.setRegDate(new Date());
        //设置用户的修改日期
        user.setUpdateDate(new Date());
        //用户密码进行加密处理
        user.setPassword(encoder.encode(user.getPassword()));
        //保存用户信息
        userDao.save(user);
    }

    /**
     * 用户登录校验
     * @param mobile 手机号
     * @param password 密码
     * @return
     */
    public User login(String mobile, String password) {
        //通过手机号获取对应的用户信息
        User user = userDao.findByMobile(mobile);
        //若用户信息不为空
        if (user != null) {
            //匹配密码是否正确
            if (encoder.matches(password,user.getPassword())) {
                //返回用户信息
                return user;
            }
        }
        //返回空
        return null;
    }

    /**
     * 获取一个随机码,随机码的范围[100000,999999]
     * @return
     */
    private String getRandomCode() {
        //设置随机码的开始范围
        int start = 100000;
        //设置随机码的结束范围
        int end = 999999;
        //生成random随机对象
        Random random = new Random();
        //从end-start范围中获取一个随机值
        int randomNum = random.nextInt(end - start);
        //返回随机值
        return String.valueOf(randomNum+start);
    }

    /**
     * 删除用户信息
     * @param userId 用户id
     */
    public void delete(String userId) {
        userDao.deleteById(userId);
    }

    /**
     * 更新用户粉丝数
     * @param userId 用户ID
     * @param num 更新数量
     */
    @Transactional
    public void updateFansCount(String userId, Integer num) {
        userDao.updateFansCount(userId,num);
    }

    /**
     * 更新用户关注数
     * @param userId 用户ID
     * @param num 更新数量
     */
    @Transactional
    public void updateFollowCount(String userId, Integer num) {
        userDao.updateFollowCount(userId,num);
    }
}
